//
// Created by ZYZ on 2020/6/22.
//

#ifndef TESTALGORITHM_BINARY_TREE_H
#define TESTALGORITHM_BINARY_TREE_H

#include "../../include/define.h"
#include "../../include/type_binary_tree.h"
#include "../../src/linear_stack/linear_stack.h"

//按先序次序输入二叉树中结点的值（一个字符），空格字符表示空树
//构造二叉链表表示的二叉树 T
Status CreateBiTree (BiTree & biTree);

//采用二叉链表存储结构，Visit 是对结点操作的应用函数。
//先序遍历二叉树 T，对每个结点调用函数 Visit 一次且仅一次。
//一旦 visit() 失败，则操作失败。
Status PreOrderTraverse (BiTree biTree, Status (*Visit) (TElemType e));

//采用二叉链表存储结构，Visit 是对结点操作的应用函数。
//中序遍历二叉树 T，对每个结点调用函数 Visit 一次且仅一次。
//一且 visit() 失败，则操作失败。
Status InOrderTraverse (BiTree biTree, Status (*Visit) (TElemType e));

//采用二叉链表存储结构，Visit 是対结点操作的应用函数。
//后序遍历二叉树 T，对每个结点调用函数 Visit ー次仅一次。
//一且 visit() 失败，则操作失败。
Status PostOrderTraverse (BiTree biTree, Status (*Visit) (TElemType e));

//采用二叉链表存储结构，Visit 是对结点操作的应用函数。
//层序遍历二叉树 T，对每个结点调用函数 Visit 一次且仅一次。
//ー旦 visit() 失败，则操作失败。
Status LevelOrderTraverse (BiTree biTree, Status (*Visit) (TElemType e));

#ifdef SELEMTYPE_BI_TREE
Status InOrderTraverseWithoutRecursion1(BiTree biTree, Status  (*Visit)(TElemType e));

Status InOrderTraverseWithoutRecursion2(BiTree biTree, Status (*Visit)(TElemType e));
#endif

void LevelOrderPrint(BiTree biTree);

#endif //TESTALGORITHM_BINARY_TREE_H
